package com.fengye.resign.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.fengye.common.domain.entity.Files;
import com.fengye.common.domain.ResponseResult;
import com.fengye.resign.service.FileService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @author sunlei
 * @version 1.0
 * @date 2024/5/27 14:53:56
 * @description 文件上传
 */
@Api(tags = "文件上传模块")
@Slf4j
@RestController
@RequestMapping("/resign")
public class FileController {

    //文件磁盘路径
    @Value("${files.upload.path}")
    private  String fileUploadPath;

    @Autowired
    private FileService fileService;

    @PostMapping(value = "/upload")
    public ResponseResult<Void> uploadFile(@RequestPart MultipartFile file) throws IOException {
        // 获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        // 获取文件名后缀
        String suffix = FileUtil.extName(originalFilename);
        // 获取文件大小，转成KB
        long size = file.getSize()/1024;

        // 文件存储的目录
        File uploadParentFile = new File(fileUploadPath);
        // 判断文件目录是否存在
        if (!uploadParentFile.exists()) {
            // 如果不存在就创建文件夹
            uploadParentFile.mkdirs();
        }

        // 定义一个文件以为标识码（UUID）
        String fileName = generateFileName(suffix);
        String localFilePath = fileUploadPath + fileName;
        File localFile = new File(localFilePath);

        String url;
        // 获取文件的md5
        String md5 = SecureUtil.md5(file.getInputStream());
        // 从数据库查询是否存在相同的记录
        Files dbFiles = fileService.getFileByMd5(md5);
        if (dbFiles != null) { // 文件已存在
            url = dbFiles.getUrl();
        } else {
            // 上传文件到磁盘
            file.transferTo(localFile);
            // 数据库若不存在重复文件，则不删除刚才上传的文件
            url = fileName;
        }

        //存储至数据库
        Files saveFile = new Files();
        saveFile.setName(originalFilename);
        saveFile.setType(suffix);
        saveFile.setSize(size);
        saveFile.setUrl(url); // 访问的时候需要拼接 http://localhost:8089/uploads/
        saveFile.setMd5(md5);
        fileService.save(saveFile);

        return ResponseResult.success("上传成功");
    }

    String generateFileName(String suffix) {
        String fileName = UUID.randomUUID().toString() + StrUtil.DOT + suffix;
        return fileName;
    }
}
